/*
 * Formulario.cpp
 *
 *  Created on: Nov 17, 2013
 *      Author: damian
 */

#include "Menu.h"
#include "Formulario.h"

using std::cout;
using std::cin;
using std::endl;
using std::getline;

Formulario::Formulario(string nombreCampos) {
	std::vector<string> nombres;
	Utilitarios::split(nombreCampos, ",", &nombres);
	for(unsigned int i=0; i<nombres.size(); i++) {
		Campo* campo = new Campo;
		campo->nombre = nombres[i];
		campo->minlen = DEFAULT_MIN_LEN;
		campo->maxlen = DEFAULT_MAX_LEN;
		campo->esNumero = false;
		campo->consultar = false;
		campo->dependencia = -1;
		campos.push_back(campo);
	}
}

Formulario::~Formulario() {
	while(!campos.empty()) {
		delete campos.back();
		campos.pop_back();
	}
}

void Formulario::setAtributos(int campo, int min, int max,
		bool esNum, bool consul, int depen) {
	setLongitudMin(campo, min);
	setLongitudMax(campo, max);
	setValorNumerico(campo, esNum);
	setConsultarIngreso(campo, consul);
	setDependenciaDeIngreso(campo, depen);
}

void Formulario::setLongitudMin(int campo, int min) {
	campos[campo]->minlen=min;
}

void Formulario::setLongitudMax(int campo, int max) {
	campos[campo]->maxlen=max;
}

void Formulario::setValorNumerico(int campo, bool esNum) {
	campos[campo]->esNumero=esNum;
}

void Formulario::setConsultarIngreso(int campo, bool consul) {
	campos[campo]->consultar=consul;
}

void Formulario::setDependenciaDeIngreso(int campo, int ingresadoAntes) {
	campos[campo]->dependencia=ingresadoAntes;
}

void Formulario::setLongitudesMimimas(int* minlens) {
	for(unsigned int i=0; i<campos.size(); i++)
		setLongitudMin(i, minlens[i]);
}

void Formulario::setLongitudesMaximas(int* maxlens) {
	for(unsigned int i=0; i<campos.size(); i++)
		setLongitudMax(i, maxlens[i]);
}

void Formulario::pedirDatos(int campo) {
	unsigned int i;
	for(i=(campo<0)?0:campo; i<((campo<0)?campos.size():campo+1); i++) {
		if(campos[i]->dependencia >= 0)
			if(!seIngresoElCampo(campos[i]->dependencia)) {
				valores[i] = "";
				continue;
			}

		if(campos[i]->consultar) {
			if(!Menu::pedirConfirmacion("Desea ingresar "+(campos[i]->nombre)+"?")) {
				valores[i] = "";
				continue;
			}
		}

		std::cout << campos[i]->nombre << ":" << std::endl;

		string valor;
		bool volverAIngresar;
		do {
			valor.clear();
			getline(cin, valor);
			volverAIngresar = false;
			if(campos[i]->esNumero && !Utilitarios::isANumber(valor)) {
				volverAIngresar = true;
				cout << "Se debe ingresar un numero, intente nuevamente" << endl;
			}
			if(valor.length() < campos[i]->minlen || valor.length() > campos[i]->maxlen) {
				volverAIngresar = true;
				cout << "Tamaño de campo inválido, intente nuevamente" << endl;
			}
		} while(volverAIngresar);
		valores[i] = valor;
	}
}

bool Formulario::seIngresoElCampo(int campo) {
	if((unsigned) campo <= valores.size())
		return !valores[campo].empty();
	return false;
}

string Formulario::getDatoAsStr(unsigned int campo) {
	return valores[campo];
}

int Formulario::getDatoAsInt(unsigned int campo) {
	return Utilitarios::stringToInt(valores[campo]);
}
